package si.unimb.engine;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import java.util.List;
import java.util.Random;

import javax.swing.JFrame;

import si.unimb.client.Client;



@SuppressWarnings("serial")
public class Platno extends JFrame implements Runnable, KeyListener, WindowListener {
	
	Thread nit;
	private Image dbImage;
	private Graphics dbg;
	private Graphics g;
	private boolean gameover;
	private Bonus prebijalec;
	private Bonus hitrost;
	private Bonus zamenjavaTipk;
	private int hitrostIgre;
	private Random generator;
	private int stevec;
	private boolean pobranBonus;
	private boolean podatkiPreneseni;
	private List<Player> aktivni_igralci;
	private Client c;
	private long mils = 0;
	private boolean init = false;
	boolean zamik = true;
		
	public Platno(List<Player> igralci, Client c) {
		
		this.c = c;
		addWindowListener(this);
		prebijalec = new Bonus(0, 0, 16, 16, 800, 700, Toolkit.getDefaultToolkit().createImage(getClass().getResource("penetrator2.png")));
		hitrost = new Bonus(0, 0, 8, 8, 800, 700, Toolkit.getDefaultToolkit().createImage(getClass().getResource("rocket.png")));
		zamenjavaTipk = new Bonus(0, 0, 16, 16, 800, 700, Toolkit.getDefaultToolkit().createImage(getClass().getResource("sideSwitch.png")));	
		generator = new Random();
		setVisible(true);
		setSize(800, 700);
		setFocusable(true);
		setBackground(new Color(205, 197, 191));
		addKeyListener(this);
		setHitrostIgre(25);
		stevec = 0;
		pobranBonus = false;
		setPodatkiPreneseni(false);
		//ai = new AI(new ClenKace (100, 300, 4, 4, 800, 700, Toolkit.getDefaultToolkit().createImage(getClass().getResource("clen_kace_testni.jpg")), 38, 40, 37, 39));
		
		aktivni_igralci = igralci;
		System.out.println("Velikost seznama igralcev: " + aktivni_igralci.size());
		init = true;
		setGameover(false);
		dbImage = null;
		dbg = null;
		start();
		
		if (zamik) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			zamik = false;
		}

	}
	
//	public void premakni(String name, String smer){
//		for(int i = 0; i < aktivni_igralci.size(); i++){
//			if(aktivni_igralci.get(i).getName().equals(name)){
//				if(smer.equals("up"))
//					aktivni_igralci.get(i).getClen().goUp();
//				if(smer.equals("down"))
//					aktivni_igralci.get(i).getClen().goDown();
//				if(smer.equals("left"))
//					aktivni_igralci.get(i).getClen().goLeft();
//				if(smer.equals("right"))
//					aktivni_igralci.get(i).getClen().goRight();
//			}				
//		}
//	}
	
	//Zagon niti
	public void start() 
	{		
		nit = new Thread(this);
		nit.start();
	} 
	
	public void run () 
	{
 
		while (!isGameover()) 
		{ 
			preveriDotikanje();
			
			dolociZmagovalca();
			
			//preveriInterakcijoZBonusom();
			
			//prikaziRandomBonus();
			

			
			for(Player p : aktivni_igralci)
				if(p.getId() == c.getId())
					p.getClen().posljiPozicijo();

			
//			repaint();
			
			try 
			{ 
//				if(aktivni_igralci.get(0).isAlive()){
					Thread.sleep (50);
//					if(!isPodatkiPreneseni()){
//						synchronized(this){
//							wait();
//							System.out.println("Cakam!");
//							setMils(System.currentTimeMillis());
//						}
//					}
//					setPodatkiPreneseni(false);
//				}else{
//					Thread.sleep (50);
//				}
			} 
			catch (InterruptedException ex) { }
			
	 
		}
	}

	// DoubleBuffer
	public void update (Graphics g) 
	{
		
		// inicializacija bufferja
		if (dbImage == null) 
		{
			dbImage = createImage (this.getSize().width, this.getSize().height); 
			dbg = dbImage.getGraphics (); 
		} 

		// pocistimo ozadje bufferja
//		dbg.setColor (getBackground ()); 
//		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height); 

		// zapecemo elemente na buffer
		dbg.setColor (getForeground()); 
		paint (dbg); 

		// izrisemo buffer 
		g.drawImage (dbImage, 0, 0, this);
		
	}
	
	int stevec3 = 0;
	
	// Metoda za izris na applet
	public void paint (Graphics g) 
	{	
		super.paint(g);
		this.g = g;
		
		
		osveziVse();
	}
	
	public void osveziVse () 
	{	
		
		System.out.println("Risem: " + ++stevec3);
		g.fillRect(0, 0, 12, 700);
		g.fillRect(0, 0, 800, 36);
		g.fillRect(788, 0, 12, 700);
		g.fillRect(0, 688, 800, 12);
		
		
		if(init)
			for(int i = 0; i < getAktivni_igralci().size(); i++) 
				getAktivni_igralci().get(i).getClen().narisiClen(g, this);
		
	
		prebijalec.narisiBonus(g, this);
		hitrost.narisiBonus(g, this);
		zamenjavaTipk.narisiBonus(g, this);
		
	}
	
	

	private void dolociZmagovalca() {
		
		int aktivniIgralci = 0;
		
		for (int i = 0; i < getAktivni_igralci().size(); i++) {
			
			if (getAktivni_igralci().get(i).getClen().isZivi()) {
				
				aktivniIgralci++;
				
			}
		}
		
		if (aktivniIgralci == 1) {
			
			//System.out.println("Konec");
			//setGameover(true);
			
		}
		
		if (aktivniIgralci == 0) {
			
			//System.out.println("Neodločeno");
			//setGameover(true);
			
		}
			
	}
	
	private void preveriDotikanje() {
		
		for (int i = 0; i < getAktivni_igralci().size(); i++) {
			
			for (int j = 0; j < getAktivni_igralci().size(); j++) {
				
				if ((i != j) && getAktivni_igralci().get(j).getClen().getPozicije().contains(getAktivni_igralci().get(i).getClen().dobiMeje())) {
					
					getAktivni_igralci().get(i).getClen().setZivi(false);
					
				}
				
			}
			
		}
		
	}
	
	private void preveriInterakcijoZBonusom() {
		
		if (stevec == 380) {
			
			pobranBonus = false;
			
			for (int i = 0; i < getAktivni_igralci().size(); i++) {
				getAktivni_igralci().get(i).getClen().vrniVPrvotnoStanje();
			}
			
		}
		
		for (int i = 0; i < getAktivni_igralci().size(); i++) {
			
			if (prebijalec.dobiMeje().intersects(getAktivni_igralci().get(i).getClen().dobiMeje()) && pobranBonus == false) {
				stevec = 0;
				prebijalec.setZivi(false);
				getAktivni_igralci().get(i).getClen().setPropustnost(true);
				pobranBonus = true;
			}
			
			if (hitrost.dobiMeje().intersects(getAktivni_igralci().get(i).getClen().dobiMeje()) && pobranBonus == false) {
				stevec = 0;
				hitrost.setZivi(false);
				getAktivni_igralci().get(i).getClen().pohitritev();
				pobranBonus = true;
			}
			
			if (zamenjavaTipk.dobiMeje().intersects(getAktivni_igralci().get(i).getClen().dobiMeje()) && pobranBonus == false) {
				stevec = 0;
				zamenjavaTipk.setZivi(false);
				for (int j = 0; j < getAktivni_igralci().size(); j++) {
					
					if (j != i) {
						
						getAktivni_igralci().get(j).getClen().zamenjajTipke();
						
					}
					
				}
				pobranBonus = true;
			}
			
		}
		
	}
	
	public void prikaziRandomBonus() {

		stevec++;
		if (stevec == 380) {
			prebijalec.setZivi(false);
			hitrost.setZivi(false);
			zamenjavaTipk.setZivi(false);
			System.out.println("nastavljam na mrtvo");
		}
		
		if (stevec >= 400) {
			stevec = 0;
			
			int random_x = generator.nextInt(801);
			int random_y = generator.nextInt(701);
			
			if (random_x <= 12) {
				random_x += 12;
			}
			
			if (random_y <= 36) {
				random_y += 36;
			}
			
			if (random_x >= 788) {
				random_x -= 12;
			}
			
			if (random_y >= 688) {
				random_y -= 12;
			}
			
			Rectangle preverjanje = new Rectangle(random_x, random_y, 16, 16);
			boolean odobri = true;
			
			for (int i = 0; i < getAktivni_igralci().size(); i++) {
				
				for (int j = 0; j < getAktivni_igralci().get(i).getClen().getPozicije().size(); j++)
					
					if (getAktivni_igralci().get(i).getClen().getPozicije().get(i).intersects(preverjanje)) {
						
						odobri = false;
						
					}
				
			}
			
			if (odobri) {
				
				pobranBonus = false;
				System.out.println("nastavljam na živo");
				int randomIndex = generator.nextInt(3);

				switch (randomIndex) {

				case 0:
					System.out.println("0");
					prebijalec.novBonus(random_x, random_y);
					break;
				case 1:
					System.out.println("1");
					hitrost.novBonus(random_x, random_y);
					break;
				case 2:
					System.out.println("2");
					zamenjavaTipk.novBonus(random_x, random_y);
					break;

				}
				
			}
		
		}

	}

	
	
	// Metoda za upravlanje z kontrolami
	public void keyPressed(KeyEvent e) 
	{
		
		for (int i = 0; i < getAktivni_igralci().size(); i++)
			if(getAktivni_igralci().get(i).getId() == c.getId())
				getAktivni_igralci().get(i).getClen().keyPressed(e);
		
		
		if(e.getKeyCode() == 10){ // Key :: ENTER
			
		}
		
	}
	
	
	// Metoda stanja kontole
	public void keyReleased(KeyEvent e) 
	{
		
	}

	// Metoda stanja kontrole
	public void keyTyped(KeyEvent e) 
	{
		
	}

	public void setHitrostIgre(int hitrostIgre) {
		this.hitrostIgre = hitrostIgre;
	}

	public int getHitrostIgre() {
		return hitrostIgre;
	}

	public void setGameover(boolean gameover) {
		this.gameover = gameover;
	}

	public boolean isGameover() {
		return gameover;
	}


	public void setAktivni_igralci(List<Player> aktivni_igralci) {
		this.aktivni_igralci = aktivni_igralci;
	}

	public List<Player> getAktivni_igralci() {
		return aktivni_igralci;
	}

	@Override
	public void windowActivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowClosed(WindowEvent e) {
		// TODO Auto-generated method stub
	}

	@Override
	public void windowClosing(WindowEvent e) {
		this.setVisible(false);
		c.sendData("/stopgame");
	}

	@Override
	public void windowDeactivated(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowDeiconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowIconified(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void windowOpened(WindowEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void setPodatkiPreneseni(boolean podatkiPreneseni) {
		this.podatkiPreneseni = podatkiPreneseni;
	}

	public boolean isPodatkiPreneseni() {
		return podatkiPreneseni;
	}
	
	public void setMils(long a){
		mils = a;
	}
	
	public long getMils(){
		return mils;
	}

	public void setG(Graphics g) {
		this.g = g;
	}

	public Graphics getG() {
		return g;
	}
	
//	public static void main(String[] args) {
//		
//		List<String> imena = new ArrayList<String>();
//		imena.add("Igor");
//		imena.add("Stojic");
//		Platno platno = new Platno(imena);
//		
//	}

}
